#!/usr/bin/python3

"""
1 lambda 语法格式：
lambda arguments: expression

2 lambda 函数特点（重点：lambda是匿名函数的一种！）：
1）lambda 函数是匿名的，它们没有函数名称，只能通过赋值给变量或作为参数传递给其他函数来使用。
2）lambda 函数通常只包含一行代码，这使得它们适用于编写简单的函数。

3 总结一下：每个函数都符合函数式编程的原则，即它们都是无副作用的，且不会修改传入的数据。这些函数提供了一种声明式的方法来处理数据，
通常比等价的命令式编程模式更加清晰简洁。
1）map用于生成按照指定规则转换后的序列。
2）filter用于生成符合特定条件的子序列。
3）reduce用于将一个序列缩减成一个单独的累积结果。
"""

# 1）无参数、无表达式
f = lambda: "Hello, world!"
print(f())  # 输出: Hello, world!

# 2）多个参数，一个表达式
x = lambda a, b : a * b
print(x(5, 6))

# 3）内置函数 map() 转换，映射的意思
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
# a) **是幂运算（平方）
# b) map(function, iterable, ...)：接受一个函数和一个迭代对象（如列表、元组等）作为参数，用函数计算迭代元素之后返回迭代对象。
#    详见 https://blog.csdn.net/qq_26917905/article/details/138130307
# c) list函数：内置函数，它可以将任何可迭代数据转换为列表类型，并返回转换后的列表。当参数为空时，list函数可以创建一个空列表。
#    不用List函数转换，map之后的迭代对象打印出来是 <map object at 0x000002AC82313F10>
result = list(map(lambda x, y: x + y, numbers1, numbers2))
print(result) # 输出 [5, 7, 9]

# 3）内置函数 filter()
# a) filter函数用于从一个可迭代对象中筛选出符合特定条件的元素。给定一个函数对象和一个可迭代对象，filter会构建一个新的迭代器，
#    其中只包含使得给定函数返回True的元素。
# b) 例子：定义检测偶数的函数
def is_even(n):
    return n % 2 == 0
# 数字列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 使用filter筛选偶数
even_numbers = list(filter(is_even, numbers))

# 4) 内置函数 reduce()
# a）reduce函数位于functools模块中，它接收一个函数（这个函数必须接受两个参数）和一个可迭代对象。
# 它会连续地将函数应用于序列的元素，从而将序列缩减为单个值。具体来说，reduce会首先将序列的前两个元素传递给函数，并运行它们；
# 然后，它会将该函数的返回值与下一个元素一起再次传递给函数，如此持续，直到序列中没有更多元素为止.
from functools import reduce
# 定义相加的函数
def add(x, y):
    return x + y
# 数字列表
numbers = [1, 2, 3, 4, 5]
# 使用reduce进行累加
result = reduce(add, numbers)
# result的值将会是15，因为reduce累加了列表中的所有数字（1+2+3+4+5）。
